import org.apache.commons.lang3.StringUtils;

public class NumberUtils {
    /**
     * 数字格式化，转化为,格式。
     * 例如将12345678 转换为12,345,678 ;
     * 123000234.12 转换为123,000,234.12
     * 1111111222.002131 转换为1,111,111,222.002131  小数点后是不加逗号的
     * 000123.12 转换为000,123.12 本方法不负责去除头部多余的0,只是隔3位加逗号操作
     *
     * @return
     */
    public static String numberFormat(String val) {
        // 方法1： 提取整数部分，并将整数部分倒序，然后将倒序之后的字符串每隔3个字符插入一个逗号
        // 再
//        String zs = val;
//        String xs = "";
//        Boolean smallFlag = false;  // 小数标志
//        if(val.contains(".")){
//            smallFlag = true;
//            int index = val.indexOf(".");
//            zs = val.substring(0, index);  // 整数部分
//            xs = val.substring(index +1);  // 小数部分
//        }
//        String reverse = StringUtils.reverse(zs);
//        // reverse 是整数部分倒序的字符串，例如源字符串为123456789.123 ，那么reverse为987654321
//        String s1 = reverse.replaceAll("(\\d{3}(?=\\d))", "$1,");
//        // \d{3}(?=\\d)匹配连续的三个数字且后面还有数字，后面不是空的。 那么匹配到的就是987 和654 （不包括321,因为321后面没有数字，是空的）
//        // 所以替换的结果就是在987后面加一个『,』 在654后面加一个『,』, s1 为987,654,321
//        zs = StringUtils.reverse(s1);
//        if(smallFlag){
//            return zs+"."+xs;
//        }
//        return zs;

        String res = val;
        // 另一种正则匹配方法，
        if (val.contains(".")) {
            String reg = "(\\d)(?=(\\d{3})+\\.)";
            res = val.replaceAll(reg, "$1,");
            // 以12345678.123 为例
            // (?=(\d{3})+\.)  说明匹配后面是 3个及3的倍数个数字加“.”结尾 的位置，678前面的位置，345前面的位置
            // 那么第一个分组\\d 匹配的就是2 和 5, 替换之后就是在2和5后面加一个逗号
        } else {
            String reg = "(\\d)(?=(\\d{3})+$)";
            res = val.replaceAll(reg, "$1,");
            // 以12345678 为例
            // (?=(\d{3})+$)  说明匹配后面是 3个及3的倍数个数字结尾 的位置，678前面的位置，345前面的位置
            // 那么第一个分组\\d 匹配的就是2 和 5  替换之后就是在2和5后面加一个逗号
        }
        return res;

    }

    public static void main(String[] args) {
        System.out.println(NumberUtils.numberFormat("12345678"));
        System.out.println(NumberUtils.numberFormat("123000234.12"));
        System.out.println(NumberUtils.numberFormat("1111111222.002131"));
        System.out.println(NumberUtils.numberFormat("000123.12"));
        System.out.println(NumberUtils.numberFormat("12."));
        System.out.println(NumberUtils.numberFormat("123"));
    }
}
